package com.miniapp.service;

import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.Map;

/**
 * 文件存储抽象接口（策略模式）
 * 支持MinIO、阿里云OSS等扩展
 * 统一文件存储操作标准
 *
 * @author yourName
 * @date 2025-09-06
 */
public interface FileStorageService {

    /**
     * 上传文件（自动处理文件名和类型）
     * @param file 上传的文件
     * @param dir 存储目录
     * @return 存储结果映射，包含fileKey、fileName等信息
     */
    Map<String, String> upload(MultipartFile file, String dir);

    /**
     * 上传文件（指定文件名）
     * @param file 上传的文件
     * @param dir 存储目录
     * @param customFileName 自定义存储文件名
     * @return 存储结果映射
     */
    Map<String, String> upload(MultipartFile file, String dir, String customFileName);

    /**
     * 上传文件（全参数控制）
     * @param file 上传的文件
     * @param dir 存储目录
     * @param customFileName 自定义存储文件名（可为null）
     * @param contentType 文件类型（可为null）
     * @return 存储结果映射
     */
    Map<String, String> upload(MultipartFile file, String dir, String customFileName, String contentType);

    /**
     * 通过输入流上传文件
     * @param inputStream 文件输入流
     * @param fileName 文件名
     * @param contentType 文件类型
     * @param dir 存储目录
     * @return 存储结果映射
     */
    Map<String, String> upload(InputStream inputStream, String fileName, String contentType, String dir);

    /**
     * 下载文件
     * @param fileKey 存储服务中的文件标识
     * @return 文件输入流
     */
    InputStream download(String fileKey);

    /**
     * 删除文件
     * @param fileKey 存储服务中的文件标识
     * @return 是否删除成功
     */
    boolean delete(String fileKey);

    /**
     * 获取文件访问URL
     * @param fileKey 存储服务中的文件标识
     * @return 文件可访问的URL
     */
    String getFileUrl(String fileKey);

    /**
     * 获取图片临时访问的链接
     * @param fileKey
     * @param contentType
     * @param fileName
     * @return
     */
    String generateTemporaryUrl(String fileKey, String contentType, String fileName);

    /**
     * 文件拷贝
     * @param sourceKey
     * @param targetKey
     * @return
     */
    boolean copy(String sourceKey, String targetKey);
}
